package com.abf.okhttp.web;

import com.alibaba.fastjson.JSON;
import okhttp3.*;
import org.springframework.util.ResourceUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
import java.io.*;
import java.security.GeneralSecurityException;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.TimeUnit;

/**
 * @author: LCG
 * 作者: LCG
 * 日期: 2021/7/22  10:00
 * 描述:
 */
@RestController
public class TestHttpsController {

    /**
     * 测试https请求
     */
   @RequestMapping("testHttps")
   public void testHttps() throws IOException, GeneralSecurityException {

       File file = ResourceUtils.getFile("classpath:www.cer");
       FileInputStream fis = new FileInputStream(file);

       X509TrustManager x509TrustManager = MyHttpsUtils.trustManagerForCertificates(fis);
       SSLContext sslContext = SSLContext.getInstance("TLS");
       //使用构建出的trustManger初始化SSLContext对象
       sslContext.init(null, new TrustManager[]{x509TrustManager}, null);
       //获得sslSocketFactory对象
       SSLSocketFactory socketFactory = sslContext.getSocketFactory();

       //1构建OKHttpClient客户端
       OkHttpClient okHttpClient = new OkHttpClient.Builder()
               //发请求给对方传递数据的超时时间
               .writeTimeout(100, TimeUnit.SECONDS)
               //接收请求返回的数据的超时时间(适合于对方服务器处理业务时间比较长的场景)
               .readTimeout(5, TimeUnit.SECONDS)
               //链接的超时时间
               .connectTimeout(100, TimeUnit.SECONDS)
               //等待创建请求的超时时间
               .callTimeout(100, TimeUnit.SECONDS)
               //注意这个connectionPool的使用 默认会创建5个链接并维持 5分钟，那么在上传的环境中就可能有一些问题
               //比如上传成功后对方服务器关闭TCP链接但是，自己本地连接池里边的链接还在，那么在复用的时候会出现，连接超时的
               //情况，这时候如果是这种情况应该设置默认的连接池不缓存空闲链接，这样每次请求都创建新的链接会避免该问题
               //因此可以设置一下的配置来实现配置连接池不缓存链接
               .connectionPool(new ConnectionPool(0,1,TimeUnit.SECONDS))
               //SSLSocketFactory：ssl套接字工厂。X509TrustManager：证书信任器管理类
               .sslSocketFactory(socketFactory,x509TrustManager)
               .build();

       //2 构建请求
       //2、构建JSON数据 使用RequestBody
       Map<String,Object> map=new HashMap<>();
       map.put("GroupID","246");
       RequestBody requestBody = FormBody.create(MediaType.parse("application/json"), JSON.toJSONString(map));
       Request request = new Request.Builder()
               //你要访问的对方的服务器的地址
               .url("https://prod-182.westus.logic.azure.com:443/workflows/cd7138434b054c619aa6c034dd79951f/triggers/manual/paths/invoke?api-version=2016-06-01&sp=%2Ftriggers%2Fmanual%2Frun&sv=1.0&sig=OWlBSmzb8HtYkBtTQ3nCYG-DRh2hFgUdoknQ5sHFc1Q")
               //请求方式 GET
               .post(requestBody)
               .build();

       //4、发送请求 获取响应内容  记得自己 try catch 一下 我这里不写了 大家 仿照上文的  get请求去处理
       ResponseBody body = okHttpClient.newCall(request).execute().body();

       //处理响应结果
       System.out.println( body.string());


   }




}
